﻿#include <iostream>
#include<opencv2/opencv.hpp>
#include<vector>
using namespace std;
using namespace cv;

/*#pragma是一种预处理指令，用于向编译器提供特定的编译和链接信息。
comment是#pragma的一个参数，它用于在对象文件或可执行文件中插入一个注释记录。
编译器会将指定库文件的信息添加到项目的链接阶段，
这样在链接过程中，链接器就会去寻找这个库文件，并将库中的相关代码和数据链接到最终的可执行文件中。

*/
#pragma comment(lib,"opencv_world450d.lib")
int main() {
  
	Mat srcImg = imread("./photo/16.jpg");
	String str = "DORAEMON";
	int baseline;
	Size textsize=getTextSize(str, 3,2.0,4,&baseline);
	//让文字居中显示
	Point textPos((srcImg.cols - textsize.width) / 2, (srcImg.rows - textsize.height) / 2);
	putText(srcImg,str, textPos, 3,2.0,Scalar(255,0,0));
	imshow("DORAEMON",srcImg);

	waitKey(0);
}

//显示单一图片并修改窗口大小
//Mat imag;
//imag = imread("./photo/2.jpg", IMREAD_COLOR);
////vector<int>compression;
////compression.push_back(IMWRITE_PNG_COMPRESSION);
////compression.push_back(9);
//if (imag.data == NULL)//imag.empty()
//{
//	cout << "Load picture failed" << endl;
//}
//else {
//	/*	bool ret=imwrite("./photo/1_2.png",imag,compression);
//		if (ret) {
//			cout << "saved successfully" << endl;
//		}
//		else {
//			cout<< "failed"<< endl;
//		}*/
//	namedWindow("我是哆啦啊梦", WINDOW_NORMAL);
//	imshow("我是哆啦啊梦", imag);
//	resizeWindow("我是哆啦啊梦", 200, 500);
//}
//
////让窗口驻留咋显示屏上，等待用户按下
//waitKey(0);
//return 0;


//单张图片在大窗口的显示
//int One_Image_Size = 240;//图片的高或宽
//int Splite_Size = 30;//每张图片的间距
//int Edge_Size = 15;//两边图片距离边缘的距离
//
//int imagesHeight = One_Image_Size * row + (row - 1) * Splite_Size + 2 * Edge_Size;//窗口的高
//int imagesWidth = One_Image_Size * colum + (colum - 1) * Splite_Size + 2 * Edge_Size;//窗口的宽
//
//Mat showWindouwsImages(imagesHeight, imagesWidth, CV_8UC3, Scalar(255, 255, 255));//最大的窗口大小
//
//int pos_x = imagesWidth - colum * One_Image_Size - (colum - 1) * Splite_Size - Edge_Size;//第一张图片的x轴坐标
//int pos_y = imagesHeight - row * One_Image_Size - (row - 1) * Splite_Size - Edge_Size;//第一张图片的y轴坐标
//
//
//Mat temp_image = Mat(showWindouwsImages, Rect(pos_x, pos_y, One_Image_Size, One_Image_Size));//在大窗口中抠出一个小图存放图片，构造一个对象
//resize(srcImage[0], temp_image, Size(One_Image_Size, One_Image_Size));
//
//namedWindow("多图显示", WINDOW_NORMAL);
//imshow("多图显示", showWindouwsImages);


//多张图片在同一窗口显示
//void showImages(vector <Mat> srcImage);//函数声明
//int main()
//{
//	vector <Mat> srcImage;
//	srcImage.push_back(imread("./photo/1.png"));
//
//	srcImage.push_back(imread("./photo/3.jpg"));
//	srcImage.push_back(imread("./photo/4.jpeg"));
//	srcImage.push_back(imread("./photo/5.jpg"));
//	srcImage.push_back(imread("./photo/11.jpg"));
//	srcImage.push_back(imread("./photo/6.jpg"));
//	srcImage.push_back(imread("./photo/7.jpg"));
//	srcImage.push_back(imread("./photo/8.jpg"));
//
//
//	srcImage.push_back(imread("./photo/10.jpg"));
//
//	for (int i = 0; i < srcImage.size(); i++) {
//		if (srcImage[i].empty()) {
//			cout << "Failed read image" << endl;
//			return -1;
//		}
//	}
//	showImages(srcImage);
//	waitKey(0);
//
//}
//void showImages(vector <Mat> srcImage) {
//	int image_num = (int)srcImage.size();//求有多少张图片
//	int row = -1, colum = -1;
//	switch (image_num) {
//	case 1:
//		row = 1; colum = 1; break;
//	case 2:
//		row = 1; colum = 2; break;
//	case 3:
//	case 4:
//		row = 2; colum = 2; break;
//	case 5:
//	case 6:
//		row = 2; colum = 3; break;
//	case 7:
//	case 8:
//		row = 2; colum = 4; break;
//	case 9:
//		row = 3; colum = 3; break;
//	default:
//		row = 3; colum = 4; break;
//	}
//	int One_Image_Size = 300;//图片的高或宽
//	int Splite_Size = 30;//每张图片的间距
//	int Edge_Size = 15;//两边图片距离边缘的距离
//
//	int imagesHeight = One_Image_Size * row + (row - 1) * Splite_Size + 2 * Edge_Size;//窗口的高
//	int imagesWidth = One_Image_Size * colum + (colum - 1) * Splite_Size + 2 * Edge_Size;//窗口的宽
//
//	Mat showWindouwsImages(imagesHeight, imagesWidth, CV_8UC3, Scalar(255, 255, 255));//最大的窗口大小
//
//	int pos_x = imagesWidth - colum * One_Image_Size - (colum - 1) * Splite_Size - Edge_Size;//第一张图片的x轴坐标
//	int pos_y = imagesHeight - row * One_Image_Size - (row - 1) * Splite_Size - Edge_Size;//第一张图片的y轴坐标
//
//	int temp_pos_x = pos_x;
//	int temp_pos_y = pos_y;
//	for (int i = 0; i < image_num; i++) {
//		if ((i % colum == 0) && (temp_pos_x != pos_x)) {
//			temp_pos_x = pos_x;
//			temp_pos_y += (One_Image_Size + Splite_Size);
//
//		}
//		Mat temp_image = Mat(showWindouwsImages, Rect(temp_pos_x, temp_pos_y, One_Image_Size, One_Image_Size));//在大窗口中抠出一个小图存放图片，构造一个对象
//		resize(srcImage[i], temp_image, Size(One_Image_Size, One_Image_Size));
//		temp_pos_x += (One_Image_Size + Splite_Size);
//
//	}
//	namedWindow("多图显示", WINDOW_NORMAL);
//	imshow("多图显示", showWindouwsImages);
//
//}



//鼠标事件代码,在图片中画线
//void on_mouse(int event, int x, int y, int flags, void* userdata) {
//	static Point pre_point, cur_point;//stativc表示是接着上次的画，该变量只初始化一次
//	Mat imag = *(Mat*)userdata;//将void*类型的指针强制转换成Mat*类型的指针，*代表取出内容
//	if (event == EVENT_LBUTTONDOWN) {
//		pre_point = Point(x, y);//获取鼠标点击的起始点
//	}
//	else if (event == EVENT_MOUSEMOVE && flags == EVENT_FLAG_LBUTTON) {
//
//		cur_point = Point(x, y);
//		line(imag, pre_point, cur_point, Scalar(255, 0, 0), 8);
//		imshow("哆啦啊梦", imag);
//		pre_point = cur_point;//变量替换，每次画完都要更新
//	}
//}
//int main()
//{
//	Mat imag;
//	imag = imread("./photo/11.jpg");
//
//	namedWindow("哆啦啊梦", WINDOW_NORMAL);
//	imshow("哆啦啊梦", imag);
//	setMouseCallback("哆啦啊梦", on_mouse, &imag);
//	resizeWindow("哆啦啊梦", 200, 200);
//	waitKey(5000);
//	destroyAllWindows();//销毁所有窗口
//	return 0;
//}



//图像处理模块，将图片转换成灰度图、HSV图，在HSV图中提取特定颜色并显示出来，用到了阈值类似掩码
//int main() {
//
//	Mat srcImag = imread("./photo/6.jpg");
//	if (!srcImag.data) {
//		cout << "Failed read" << endl;
//		return -1;
//	}
//	namedWindow("原始图片", WINDOW_NORMAL);
//	imshow("原始图片", srcImag);
//
//	Mat grayImage;
//	cvtColor(srcImag, grayImage, COLOR_BGR2GRAY);
//	namedWindow("灰度图", WINDOW_NORMAL);
//	imshow("灰度图", grayImage);
//	resizeWindow("灰度图", 500, 500);
//	Mat HsvyImage;
//	cvtColor(srcImag, HsvyImage, COLOR_BGR2HSV);
//	namedWindow("HSV", WINDOW_NORMAL);
//	imshow("HSV", HsvyImage);
//	//掩码，类比于面具和脸，只看得到你想要看的地方
//	Scalar colour_lower(100, 43, 46);//阈值的最小值
//	Scalar colour_upper(124, 255, 255);//阈值的最大值
//
//	Mat colour_part;
//	inRange(HsvyImage, colour_lower, colour_upper, colour_part);
//	namedWindow("colour_part", WINDOW_NORMAL);
//	imshow("colour_part", colour_part);
//
//
//	waitKey(0);
//}

//Scalar类：用来存放一个像素的类，长度为四的元素构成的一个类
//int main() {
//	//单通到  黑  灰  白
//	//Scalar  scalar1(128); //0 ->黑 2545->白
//	//Mat mat(120,240,CV_8UC1,scalar1); //一共有120*240个像素点，每个像素点由8个比特位构成
//	//imshow("picture",mat);
//
//	//多通道 BGR
//	Scalar scalar2(0, 150, 150);
//	Mat mat(120, 240, CV_32FC3, scalar2);//一共有120*240个像素点，每个像素点由32个比特位浮点数构成
//	imshow("picture", mat);
//	waitKey(0);
//}


//绘制椭圆，矩形，圆性，三个函数
//int main() {
//	Mat soureImg = imread("./photo/8.jpg");
//	Rect  ret = Rect(10, 30, 300, 200);
//	//rectangle(soureImg,ret,Scalar(0,0,255),-1);//将线条的粗细设置为-1，则会将矩形的内部填充指定颜色
//	//rectangle(soureImg, Point(10, 30), Point(400, 700),Scalar(0,0,255), 5);	
//
//	//circle(soureImg,Point(60,60),30,Scalar(0,255,0),5);
//	//ellipse(soureImg,Point(200,400),Size(200/8,200/4),0,0,360,Scalar(0,255,0) ,5);
//
//
//	//ellipse(soureImg, Point(200, 400), Size(200 / 4, 200 / 4), 90, 0, 360, Scalar(0, 255, 0), 5);
//
//	ellipse(soureImg, Point(300, 200), Size(400 / 8, 400 / 8), 0, 0, 90, Scalar(0, 0, 0), 8);
//	ellipse(soureImg, Point(300, 200), Size(400 / 8, 400 / 8), 90, 0, 90, Scalar(0, 0, 0), 8);
//	ellipse(soureImg, Point(300, 200), Size(400 / 8, 400 / 8), 180, 0, 90, Scalar(0, 0, 0), 8);
//
//	ellipse(soureImg, Point(300, 500), Size(400 / 8, 400 / 8), 0, 0, 270, Scalar(0, 0, 0), 8);
//
//	ellipse(soureImg, Point(100, 500), Size(400 / 4, 400 / 4), 0, 120, 240, Scalar(125, 125, 125), 8);
//	imshow("picture", soureImg);
//	waitKey(0);
//}


//用线画出规则图形（平行四边形）
//int main() {
//	Mat sourceImg = imread("./photo/2.jpg");
//	//line(sourceImg,Point(100,400),Point(300,400),Scalar(255,0,0),5);
//	//line(sourceImg, Point(200, 200), Point(200, 800),Scalar(0,255,0),5);
//	vector<Point> point = { Point(100,100),Point(300,100),Point(200,200),Point(0,200) };
//
//	fillPoly(sourceImg, point, Scalar(255, 0, 0));
//	imshow("picture", sourceImg);
//	waitKey(0);
//}

//如何选择特定的感兴趣的区域ROI，并将感兴趣区域的图片提取出来
//int main() {
//	//原图
//	Mat srcImg = imread("./photo/16.jpg");
//	vector <Point> point = { Point(92,150),Point(246,60),Point(290,190),Point(240,260),Point(155,240) };
//	polylines(srcImg, point, true, Scalar(255, 0, 0), 5);
//	imshow("picture", srcImg);
//
//	//相当于掩码（面罩）
//	Mat mask;
//	srcImg.copyTo(mask);
//	mask.setTo(Scalar::all(0));
//	fillPoly(mask, point, Scalar(255, 255, 255));
//	//imshow("MASK", mask);  中间图片不需要显示
//
//	//透过掩码生成的图片
//	Mat dst;
//	srcImg.copyTo(dst, mask);
//	imshow("result", dst);
//	waitKey(0);
//
//}
